home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 240 (DVD) / Issue 240 - February 2008 - DPCS0208DVD.ISO / Extras / NetObjects Fusion / NOF10.exe / data1.cab / FSI / Update / lib / nof / update / Updater.js < prev   
Encoding:
Text File  |  2007-04-11  |  45.4 KB  |  1,166 lines

  1. /****i* SOURCE_FILE/INFO
  2. *
  3. * NAME
  4. *    Updater.js
  5. *
  6. * USAGE
  7. *    Part of WPS JavaScript Library.
  8. *
  9. * COPYRIGHT
  10. *    Copyright ⌐ 2000-2001 Website Pros, Inc.
  11. *    All Rights Reserved.
  12. *
  13. *  This is an unpublished work protected by Website Pros, Inc.
  14. *  as a trade secret, and is not to be used or disclosed except as
  15. *  expressly provided in a written license agreement executed by
  16. *  you and Website Pros, Inc.
  17. *
  18. *      <copyright@websitepros.com>
  19. *
  20. * NOTES
  21. *    JavaScript code.
  22. *
  23. *****/
  24. if (!IS.isModuleInitialized("IS.NOF.UPDATE.Updater"))
  25.     /****h* NOF_JavaScript_Library/NOF.UPDATE.Updater
  26.     *
  27.     * NAME
  28.     *  NOF.UPDATE.Updater
  29.     *
  30.     * DESCRIPTION
  31.     *    
  32.     * The <code>Updater</code> class. 
  33.     * External dependencies: 
  34.     * NOF.App, NOF.UTIL.ResourceBundle, NOF.NET.Http, NOF.NET.HttpRequest, NOF.XML.XmlDocument, NOF.DIALOGS.Messages,
  35.     * NOF.DIALOGS.BrowserDlg, NOF.DIALOGS.ProgressDlg, NOF.DIALOGS.FileDlg, NOF.NOFSettings, NOF.Session
  36.     ****/    
  37.     
  38.     /** 
  39.     * 
  40.     */
  41.     function NOF_Update( ) {
  42.         this.__proto__ = NOF_Update.prototype;
  43.         
  44.         this.CLASS_NAME = "Update"; 
  45.         
  46.         this.app    = NOF.App.getFSIApp();
  47.         this.app2    = NOF.App.getFSIApp2();
  48.         
  49.         this.updatesChecked        = false;
  50.         
  51.         this.releases            = null;
  52.         
  53.         this.releasesString = [];    
  54.         
  55.         this.regEditObj = new NOF.NOFSettings();
  56.         var regVers = this.regEditObj.get( "Version", NOF.NOFSettings.STRING_VALUE );
  57.         //do the versionInfo thing
  58.         regVers = regVers.split(".");
  59.         this.versionInfo = this.regEditObj.get( "VersionInfo", NOF.NOFSettings.STRING_VALUE );
  60.         this.currentVersion = ""+regVers[0]+"."+regVers[1]+"."+this.versionInfo+"."+regVers[3];
  61.         
  62.         this.stayClosed = false;
  63.         
  64.     }
  65.     
  66.     
  67.     function NOF_Update_ProtoBuilder() {
  68.         
  69.         var method = NOF_Update.prototype;
  70.         
  71.         method.RELEASE_NOTES_FILENAME  = "ReleaseNotes.html";    
  72.         method.RELEASE_WINDOW_WIDTH    = 650;
  73.         method.RELEASE_WINDOW_HEIGHT   = 500;
  74.         
  75.         method.UPDATER_TXT_PARAM       = 'updater.txt';
  76.         method.START_VERSION           = "10.00";
  77.         method.END_VERSION             = "11.00";
  78.         method.AUTO_UPDATE_URL         = "http://www.netobjects.com/dev/Fusion/Releases/Fusion10.xml";
  79.         
  80.         method.checkUpdate             = checkUpdate;
  81.         
  82.         method.Release                 = Release;
  83.         method.getLatestReleaseIndex   = getLatestReleaseIndex;
  84.         method.getReleaseIndex         = getReleaseIndex;
  85.         method.getNeededReleases       = getNeededReleases;
  86.         
  87.         method.getLatestRelease        = getLatestRelease;
  88.         method.getRelease              = getRelease;
  89.         method.showReleaseNotes        = showReleaseNotes;
  90.         method.showPreviousReleaseNotes= showPreviousReleaseNotes;
  91.         method.getNumberOfReleases     = getNumberOfReleases;
  92.         method.downloadRelease         = downloadRelease;
  93.         method.isDuplicateVersion      = isDuplicateVersion;
  94.         
  95.         method.isUpdateNeeded          = isUpdateNeeded;
  96.         method.shouldCheckForUpdates   = shouldCheckForUpdates;
  97.         
  98.         method.setLastUpdateDate       = setLastUpdateDate;
  99.         method.getLastUpdateDate       = getLastUpdateDate;
  100.         
  101.         method.setLastCheckDate           = setLastCheckDate;
  102.         method.getLastCheckDate           = getLastCheckDate;
  103.         
  104.         method.iterateReleases         = iterateReleases;
  105.         method.autoUpdate              = autoUpdate;
  106.         method.getAvailableUpdatesType = getAvailableUpdatesType;
  107.         
  108.         /**
  109.         * internal class Release
  110.         */
  111.         function Release( version, versionInfo, build, releaseDate, summaryNotes, releaseNotesURL, releaseNotes, distributions, mediaCD ) {
  112.             
  113.             //NOF.util_logging_ConsoleLogger_global.info("Release.constructor");                
  114.             this.version        = version;
  115.             this.versionInfo    = versionInfo; 
  116.             this.build            = build;    
  117.             this.releaseDate    = releaseDate;
  118.             this.summaryNotes    = summaryNotes;
  119.             this.releaseNotesURL= releaseNotesURL;            
  120.             this.releaseNotes    = releaseNotes; 
  121.             
  122.             this.distributions    = distributions;
  123.             this.mediaCD        = mediaCD;                    
  124.         }
  125.         
  126.         /**
  127.         * Distribution - internal class used by Release
  128.         **/
  129.         function Distribution( installType, downloadSize, requires, regEntries, mirrors) {
  130.             this.installType = installType;
  131.             this.downloadSize= downloadSize;
  132.             this.requires = requires;
  133.             this.regEntries = regEntries;
  134.             this.mirrors = mirrors; // mirrors[i].name, mirrors[i].url 
  135.         }
  136.         
  137.         Release.prototype.Distribution = Distribution;
  138.         
  139.         /**
  140.         * RegEntry - internal class used by Distribution
  141.         **/
  142.         function RegEntry( base, regName, regValue, regType) {        
  143.             this.base        = base;
  144.             this.regName    = regName;
  145.             this.regValue    = regValue;
  146.             this.regType    = regType;
  147.         }
  148.         
  149.         Distribution.prototype.RegEntry = RegEntry;
  150.         
  151.         Distribution.prototype.toString = function Distribution_toString() {
  152.             var str = this.installType + ", "+this.downloadSize + ", requires=" + this.requires + "\n";
  153.             for (var i=0; i < this.regEntries.length; i++) {
  154.                 str += this.regEntries[i].toString() + "\n";
  155.             }
  156.             for (var i=0; i < this.mirrors.length; i++) {
  157.                 str += this.mirrors[i].name +" : "+ this.mirrors[i].url + "\n";
  158.             }
  159.             return str;        
  160.         }    
  161.         
  162.         Release.prototype.toString = function Release_toString() {
  163.             var str = this.version +"."+ this.versionInfo +"."+ this.build + "\n"+                
  164.                 this.releaseDate + "\n"+
  165.                 this.summaryNotes + "\n";                        
  166.             //str += "releaseNotes = \n"+this.releaseNotes + "\n";
  167.             
  168.             for (var i=0; i < this.distributions.length; i++) {
  169.                 str += this.distributions[i].toString()+"\n";
  170.             }        
  171.             return str;                            
  172.         }
  173.         
  174.         Release.prototype.hasFullUpdateDistribution = function Release_hasFullUpdateDistribution() {
  175.             for (var i=0; i < this.distributions.length; i++) {
  176.                 if (this.distributions[i].installType == "full")
  177.                     return true;
  178.             }
  179.             return false;
  180.         }
  181.         
  182.         RegEntry.prototype.toString = function RegEntry_toString() {
  183.             return (this.base +"/"+ this.regName +"="+ this.regValue);
  184.         }
  185.         
  186.         /**
  187.         * getLatestRelease
  188.         **/    
  189.         function getLatestRelease() {
  190.             var lri = this.getLatestReleaseIndex();
  191.             return lri >= 0 ? this.releases[lri] : null;
  192.         }
  193.         
  194.         /**
  195.         * getLatestReleaseIndex
  196.         **/
  197.         function getLatestReleaseIndex() {
  198.             if (!this.updatesChecked) {
  199.                 this.checkUpdate();
  200.             }
  201.             
  202.             var latestVersion = this.currentVersion;
  203.             var versionI;
  204.             var maxReleaseIndex = -1;
  205.             for (var i=0; i < this.releases.length; i++) {
  206.                 
  207.                 versionI = this.releases[i].version+"."+this.releases[i].versionInfo+"."+this.releases[i].build;            
  208.                 if( latestVersion <= versionI ) {
  209.                     maxReleaseIndex = i;
  210.                     latestVersion = versionI;
  211.                 }    
  212.             }
  213.             return maxReleaseIndex;
  214.         }
  215.         
  216.         /**
  217.         * getReleaseIndex
  218.         **/
  219.         function getReleaseIndex(version, versionInfo, build) {        
  220.             if (!this.updatesChecked) {
  221.                 this.checkUpdate();
  222.             }
  223.             
  224.             var req = null;
  225.             if ( arguments.length == 1 ) {
  226.                 req = arguments[0];            
  227.             } else if ( arguments.length == 3 ) {
  228.                 req = version+"."+versionInfo+"."+build;
  229.             }
  230.             
  231.             for (var i=0; i < this.releases.length; i++) {            
  232.                 if ( (this.releases[i] != null) && (req == this.releases[i].version+"."+this.releases[i].versionInfo+"."+this.releases[i].build) ) {
  233.                     return i; //this.releases[i];
  234.                 }
  235.             }
  236.             return -1;
  237.         }
  238.         
  239.         /**
  240.         * getRelease
  241.         **/
  242.         function getRelease(version, versionInfo, build) {
  243.             if (arguments.length == 1) {
  244.                 if ( (arguments[0] - 0 > -1) || (arguments[0] - 0 < this.releases.length) ) {
  245.                     return this.releases[arguments[0]];
  246.                 } else {
  247.                     return null;
  248.                 }
  249.             } else {
  250.                 var ri = this.getReleaseIndex(version, versionInfo, build);
  251.                 if ( ri > -1 && ri < this.releases.length ) {
  252.                     return this.releases[ri];
  253.                 } else {
  254.                     return null;
  255.                 }
  256.             }
  257.         }
  258.  
  259.         /**
  260.         * Determine if the current status and settings of the application 
  261.         * indicates that a check for updates should be made.
  262.         * @param whenUpdate - NOF.UPDATE.UpdateOptions.CHECK_ON_LOAD or CHECK_ON_CONNECT
  263.         * @return true if auto-update was set and 
  264.         * the difference between current date and last check for update date exceeds the interval set and
  265.         * the whenUpdate argument matches the setting chosen (i.e. NOF.UPDATE.UpdateOptions.CHECK_ON_LOAD matches with Fusion launch)
  266.         **/
  267.         function shouldCheckForUpdates(/*int*/ whenUpdate) {
  268.             var log = NOF.UTIL.LOGGING.getLogger("InitFusion");
  269.             
  270.             try {                
  271.                 
  272.                 //var cu    = this.regEditObj.get('Settings\\CheckUpdate', NOF.NOFSettings.INT_VALUE, true);
  273.                 var isAutoUpdate = NOF.UPDATE.UpdateOptions.isSetAutoUpdate();
  274.                 
  275.                 //var uf    = this.regEditObj.get('Settings\\UpdateFrequency', NOF.NOFSettings.INT_VALUE, true);
  276.                 
  277.                 var uf = NOF.UPDATE.UpdateOptions.getUpdateFrequency();
  278.                 //var um    = this.regEditObj.get('Settings\\UpdateMethod', NOF.NOFSettings.INT_VALUE, true);
  279.                 
  280.                 //log.info("Update:isUpdateNeeded CheckUpdate="+cu+"\n UpdateFrequency="+uf+"\n UpdateMethod="+um + " \n whenUpdate=" + whenUpdate + " = " + NOF.UPDATE.UpdateOptions.CHECK_ON_LOAD);
  281.                 log.info("Update:isUpdateNeeded CheckUpdate="+isAutoUpdate+"\n UpdateFrequency="+uf+ " \n whenUpdate=" + NOF.UPDATE.UpdateOptions.getEventToCheckForUpdates() + " = " + NOF.UPDATE.UpdateOptions.CHECK_ON_LOAD);
  282.                 //if (cu == 1) { // Manual update
  283.                 if (isAutoUpdate == false) {
  284.                     return false;
  285.                 }
  286.                 var now = new Date();
  287.                 var ms = now.getTime();
  288.                 var lastChecked = this.getLastCheckDate(); //NOF.App.getFSIApp2().DataLastChecked;                
  289.                 var hoursDiff = Math.round(( ms/1000 - lastChecked/1000 )/(60*60));
  290.                 //var hoursDiff = Math.round(( ms/1000 - lastChecked )/(60*60));
  291.                 
  292.                 switch (uf) {
  293.                     case 0: {     // Weekly
  294.                         if (hoursDiff > 24*7)
  295.                             return true;
  296.                         break;
  297.                     }
  298.                     case 1: {     // Daily
  299.                         if (hoursDiff > 24)
  300.                             return true;
  301.                         break;
  302.                     }
  303.                     case 2: {     // Monthly
  304.                         if (hoursDiff > 24*30)
  305.                             return true;
  306.                         break;
  307.                     }
  308.                 }
  309.                 return false;                
  310.             } catch(edate) {
  311.                 log.error("NOF.UPDATE.Updater.shouldCheckForUpdate "+edate.message );
  312.             }
  313.             
  314.         }
  315.         
  316.         
  317.         /**
  318.         * @param Date object
  319.         **/
  320.         function setLastUpdateDate(/*Date*/ updateDate) {            
  321.             try {
  322.                 this.regEditObj.put("DateLastUpdate", Math.round( updateDate.getTime()/1000 ) );
  323.             } catch (edate) {
  324.                 //log.error(this.CLASS_NAME+".setLastUpdateDate "+edate );                
  325.             }
  326.         }
  327.         
  328.         /**
  329.         * @return Date object
  330.         **/
  331.         function getLastUpdateDate() {            
  332.             var d = NOF.App.getFSIApp2().DateLastUpdate;
  333.             if (d) {
  334.                 d = new Date(d * 1000);
  335.             }
  336.             return d;            
  337.         }
  338.         
  339.         /**
  340.         * 
  341.         **/
  342.         function setLastCheckDate(/*Date*/ updateDate) {            
  343.             try {
  344.                 this.regEditObj.put("DataLastChecked", Math.round( updateDate.getTime()/1000 ) );
  345.             } catch (edate) {
  346.                 //log.error(this.CLASS_NAME+".setLastCheckDate "+edate );                
  347.             }
  348.         }
  349.         /**
  350.         * 
  351.         **/
  352.         function getLastCheckDate() {            
  353.             var d = NOF.App.getFSIApp2().DataLastChecked;
  354.             if (d) {
  355.                 d = new Date(d * 1000);
  356.             }
  357.             return d;
  358.         }
  359.         
  360.         /**
  361.         * isUpdateNeeded
  362.         **/
  363.         function isUpdateNeeded( ) {
  364.             
  365.             //try {
  366.             //    this.regEditObj.put("DataLastChecked", Math.round( (new Date()).getTime()/1000) );
  367.             //} catch (edate){
  368.                 
  369.             //}
  370.             this.setLastCheckDate(new Date());
  371.             
  372.             if ( this.updatesChecked == false ) {
  373.                 if (this.checkUpdate() == -1)
  374.                     return false;
  375.             }
  376.             var latestRelease = this.getLatestRelease();
  377.             if (latestRelease == null)
  378.                 return false;
  379.             return this.currentVersion < (latestRelease.version +"."+ latestRelease.versionInfo +"."+ latestRelease.build);
  380.         }
  381.         
  382.         /**
  383.         * iterateReleases
  384.         */
  385.         function iterateReleases(n, sum, path, tabs) {                
  386.             var METHOD_NAME = "iterateReleases";        
  387.             //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+ " init.");
  388.             
  389.             var tstr = "";
  390.             for(var i=0;i<tabs;i++)
  391.                 tstr += "\t";
  392.             
  393.             if (n == null) {
  394.                 this.releasesString[path + "|" + this.currentVersion] = sum;
  395.                 return;
  396.             }
  397.             if ( n.version+"."+n.versionInfo+"."+n.build == this.currentVersion ) {
  398.                 this.releasesString[path+"|"+ n.version+"."+n.versionInfo+"."+n.build ] = sum;
  399.                 return;
  400.             }
  401.             
  402.             //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+ tstr + n.version+"."+n.versionInfo+"."+n.build + "\r\n");        
  403.             
  404.             for (var i=0; i < n.distributions.length; i++) {    
  405.                 
  406.                 this.releasesString[path+"|"+ n.version+"."+n.versionInfo+"."+n.build +":" + i] = sum + n.distributions[i].downloadSize;
  407.                 //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+ tstr + "sum="+ (sum + n.distributions[i].downloadSize) +"\r\n");
  408.                 
  409.                 this.iterateReleases( ( (n.distributions[i].requires != null ) ? this.getRelease(this.getReleaseIndex(n.distributions[i].requires)) : null), sum + n.distributions[i].downloadSize, path + "|"+ n.version+"."+n.versionInfo+"."+n.build +":"+i, tabs+1);            
  410.             }        
  411.         }
  412.         
  413.         /**
  414.         * autoUpdate
  415.         **/
  416.         function autoUpdate( iterRelease, chosedMirror, propertiesObj ) {
  417.             var METHOD_NAME = "autoUpdate";                        
  418.             //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+ " init");        
  419.             var infoArr = this.getNeededReleases( iterRelease, chosedMirror );
  420.             if (infoArr.length == 0) {
  421.                 return -1;
  422.             }
  423.             //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+ " infoArr:\r\n" + infoArr.join("\n") );        
  424.             var doRestart = false;
  425.             
  426.             var progDlg = new NOF.DIALOGS.ProgressDlg();
  427.             
  428.             var count = 0;
  429.             var containsFullUpdate = false;
  430.             
  431.             for (var j=0; j < infoArr.length; j++) {
  432.                 
  433.                 //if ( this.app.SetProgressMessage( NOF.TEXT.MessageFormat.format( propertiesObj.getProperty('progressMessage.downloading'), (j+1), infoArr.length ) ) )
  434.                 if ( progDlg.setMessage( NOF.TEXT.MessageFormat.format( propertiesObj.getProperty('progressMessage.downloading'), (j+1), infoArr.length ) ) ) {
  435.                     return -1;
  436.                 }
  437.                 var thetype = infoArr[j].distribution.installType;            
  438.                 
  439.                 
  440.                 if (thetype == 'full' || thetype == 'patch' || thetype == 'migrate') {
  441.                     doRestart = true;                
  442.                 }
  443.                 
  444.                 if (thetype == 'full') {
  445.                     this.stayClosed = true;                
  446.                     containsFullUpdate = true;
  447.                 }
  448.                 
  449.                 if (chosedMirror == null) {
  450.                     // suppose that the first mirror is the most reliable
  451.                     chosedMirror = infoArr[j].distribution.mirrors[0].name;
  452.                 }
  453.                 
  454.                 var path = "";
  455.                 
  456.                 for (var k=0; k < infoArr[j].distribution.mirrors.length; k++) {
  457.                     if ( chosedMirror.trim() == infoArr[j].distribution.mirrors[k].name ) {
  458.                         //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+" chosedMirror="+chosedMirror+", url="+infoArr[j].distribution.mirrors[k].url);
  459.                         path = infoArr[j].distribution.mirrors[k].url;
  460.                         break;
  461.                     }
  462.                 }
  463.                 
  464.                 var localArgs = path.split('/');
  465.                 var localPath = NOF.App.getTempDirectory() + '\\' + localArgs[localArgs.length - 1];
  466.                 
  467.                 
  468.                 if ( (containsFullUpdate == true) && (infoArr.length > 1) ) {
  469.                     message( propertiesObj.getProperty('message.downloadingFullUpdate'), 'info', 'nof_update_downloadingFullUpdate', propertiesObj.getProperty('message.downloadingFullUpdate.addHeight') - 0, null, propertiesObj.getProperty('message.downloadingFullUpdate.title') );                
  470.                 }
  471.                 
  472.                 //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+ " download "+ path +" to "+localPath+", installType="+thetype);
  473.                 
  474.                 //if ( !this.app.HttpDownload(path, '', '', true, localPath, true) ) {
  475.                 var req = new NOF.NET.HttpRequest(path);
  476.                 var httpObj = new NOF.NET.Http(req);
  477.                 var downloadResult = httpObj.download(localPath, true);
  478.                 httpObj = null;
  479.                 req = null;
  480.                 if ( !downloadResult ) {
  481.                     if (j == 0) {
  482.                         // We didn't get any files.
  483.                         return 0;
  484.                     } else {
  485.                         // Update using the files we did get.
  486.                         break;
  487.                     }                
  488.                 }                                
  489.                 
  490.                 // !! set here a new member - localURL!
  491.                 infoArr[j].distribution.localURL = localPath;
  492.                 
  493.                 count++;
  494.                 
  495.                 if (containsFullUpdate == true) {
  496.                     break;
  497.                 }
  498.             }        
  499.             
  500.             //        ?
  501.             
  502.             if (doRestart && this.app.StringArg == 'Installer' && !containsFullUpdate) {
  503.                 doRestart = false;
  504.             }
  505.             
  506.             //        ?
  507.             
  508.             if (doRestart) {
  509.                 NOF.Session.setVariable("restartFusion", "true");
  510.             }
  511.             
  512.             //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+ " doRestart="+doRestart+", count="+count);
  513.             
  514.             var currentUpdate = this.regEditObj.get("CurrentUpdate", NOF.NOFSettings.INT_VALUE);
  515.             var currentUpdateIndex = currentUpdate;
  516.             
  517.             if ( doRestart && (count > 0) ) {
  518.                 // write updater.txt
  519.                 // first line
  520.                 this.app.WriteTempFile(this.UPDATER_TXT_PARAM, count + ',' + /*this.app.AppDirectory*/ NOF.App.getExeLocation() + ',' + this.regEditObj.getRegistryBase() + '\n', false);            
  521.                 //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+ " "+ count + ',' + this.app.AppDirectory + ',' + this.regEditObj.getRegistryBase() );
  522.                 
  523.                 // updates
  524.                 for (var j=0; j < count; j++) {
  525.                     
  526.                     currentUpdateIndex = (currentUpdate + j + 1);
  527.                     
  528.                     for (var k=0; k < infoArr[j].distribution.regEntries.length; k++) {
  529.                         if ( infoArr[j].distribution.regEntries[k].regName == "CurrentUpdate" ) {
  530.                             currentUpdateIndex = infoArr[j].distribution.regEntries[k].regValue;
  531.                             break;
  532.                         }
  533.                     }
  534.                     
  535.                     this.app.WriteTempFile(this.UPDATER_TXT_PARAM, currentUpdateIndex + "," + infoArr[j].distribution.installType + "," + infoArr[j].distribution.localURL + "," + infoArr[j].release.version+"."+infoArr[j].release.versionInfo+"."+infoArr[j].release.build + '\n', true);
  536.                     //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+ " "+currentUpdateIndex + "," + infoArr[j].distribution.installType + "," + infoArr[j].distribution.localURL + "," + infoArr[j].release.version+"."+infoArr[j].release.versionInfo+"."+infoArr[j].release.build);
  537.                 }
  538.                 
  539.                 this.app.CopyTempFile(NOF.App.getExeLocation() + 'UTUnpack.dll');
  540.                 
  541.                 var updaterPath = NOF.App.getExeLocation() + 'FSIUpdater\\Updater.zip';
  542.                 this.app2.ExtractZipFile(updaterPath, NOF.App.getTempDirectory());
  543.                 // if Updater.exe is not contained by the Updater.zip we could have 
  544.                 // this.app.CopyTempFile(NOF.App.getExeLocation() + 'FSIUpdater\\Updater.exe');
  545.                 
  546.                 var latest = currentUpdateIndex;
  547.                 //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+ " latestUpdate = "+latest);
  548.                 //alert("control");
  549.                 //return 3;
  550.                 if (this.app.StringArg == 'Installer' && containsFullUpdate) {
  551.                     NOF.App.setVariable("InstallerParams", '/fusion="' + NOF.App.getExeLocation() + 'Fusion.exe"' + ' /input="' + NOF.App.getTempDirectory() + '\\'+this.UPDATER_TXT_PARAM+'" '+ currentUpdate+" "+ latest);
  552.                 }else{
  553.                     this.app.CallUpdater(NOF.App.getTempDirectory() + '\\Updater.exe', '/fusion="' + NOF.App.getExeLocation() + 'Fusion.exe"', '/input="' + NOF.App.getTempDirectory() + '\\'+this.UPDATER_TXT_PARAM+'"', currentUpdate, latest, '');
  554.                 }
  555.                 return 1;            
  556.                 
  557.             }
  558.             
  559.             for (var j=0; j < count; j++) {
  560.                 
  561.                 //if ( this.app.SetProgressMessage( NOF.TEXT.MessageFormat.format( propertiesObj.getProperty('progressMessage.installing'), (j+1), count ) ) )
  562.                 if ( progDlg.setMessage( NOF.TEXT.MessageFormat.format( propertiesObj.getProperty('progressMessage.installing'), (j+1), count ) ) ) {
  563.                     return -1;
  564.                 }
  565.                 var localPath = infoArr[j].distribution.localURL;
  566.                 var localArgs = localPath.split('\\');
  567.                 var thePath = NOF.App.getExeLocation() + localArgs[localArgs.length - 1];
  568.                 var s = thePath.split('.');
  569.                 
  570.                 if (s[s.length - 1] == 'zip') {
  571.                     if (!this.app2.ExtractZipFile(localPath, NOF.App.getExeLocation()))
  572.                         return 0;
  573.                 } else {
  574.                     this.app.CopyFileToBase(localPath);    // The file must be executed in the base directory.
  575.                     if (this.app.Spawn(thePath, '/auto', NOF.App.getExeLocation(), '', '', '')) {
  576.                         this.app.DeleteFileFromBase(thePath);
  577.                     } else {
  578.                         this.app.DeleteFileFromBase(thePath);
  579.                         return 0;
  580.                     }
  581.                 }
  582.                 
  583.                 try {
  584.                     
  585.                     currentUpdateIndex = (currentUpdate + j + 1);
  586.                     
  587.                     for (var k=0; k < infoArr[j].distribution.regEntries.length; k++) {
  588.                         var prevUpdateKey = this.regEditObj.put(infoArr[j].distribution.regEntries[k].regName, infoArr[j].distribution.regEntries[k].regValue);
  589.                         //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+ " previousUpdateKey=" + prevUpdateKey + ", current key: " + infoArr[j].distribution.regEntries[k].regName + "=" + infoArr[j].distribution.regEntries[k].regValue + ", type=" + infoArr[j].distribution.regEntries[k].regType);                    
  590.                     }
  591.                     
  592.                     var prevRelease = this.regEditObj.put("Version", infoArr[j].release.version+"."+infoArr[j].release.versionInfo+"."+infoArr[j].release.build);
  593.                     //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+ " previousReleaseVersion=" + prevRelease + ", CurrentVersion=" + infoArr[j].release.version+"."+infoArr[j].release.versionInfo+"."+infoArr[j].release.build);
  594.                     
  595.                 } catch (e) {
  596.                     //alert( e.getMessage() );
  597.                     //NOF.util_logging_ConsoleLogger_global.warn(this.CLASS_NAME+"."+METHOD_NAME+ " "+e );                
  598.                 }                        
  599.             }
  600.             try {
  601.                 //this.regEditObj.put("DateLastUpdate", Math.round( (new Date()).getTime()/1000) );
  602.                 this.setLastUpdateDate(new Date());
  603.             } catch (edate){
  604.                 //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+ " "+edate );                
  605.             }
  606.             return 3;
  607.         }
  608.         
  609.         
  610.         /**
  611.         * getNeededReleases
  612.         **/
  613.         function getNeededReleases( iterRelease, chosedMirror ) {
  614.             var METHOD_NAME = "getNeededReleases";                
  615.             
  616.             //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+ " init");        
  617.             
  618.             //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+ " release \r\n" + iterRelease.toString());        
  619.             
  620.             if ( this.updatesChecked == false ) {
  621.                 if (this.checkUpdate() == -1)
  622.                     return new Array();
  623.             }
  624.             
  625.             this.releasesString = [];                
  626.             
  627.             this.iterateReleases(iterRelease, 0, "", 1);
  628.             
  629.             var min = 0;
  630.             var path = "";
  631.             
  632.             //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+ " "+ this.releasesString.join("\n") +"\r\n\r\n\r\n");
  633.             
  634.             for (var u in this.releasesString) {
  635.                 
  636.                 if( u.indexOf(this.currentVersion) == (u.length - this.currentVersion.length) ) {
  637.                     if (min == 0 || this.releasesString[u] < min) {
  638.                         min = this.releasesString[u];
  639.                         path = u;
  640.                         //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+" min sum = "+min+", path = "+path +"\r\n");
  641.                     }
  642.                 } else {
  643.                     continue;
  644.                 }                
  645.             }
  646.             
  647.             //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+" final result \r\n min sum = "+min+", path = "+path +"\r\n");
  648.             var distribs = path.split("|"); 
  649.             
  650.             var releaseID, distrNo, distribution, release;
  651.             
  652.             var infoArr = [];
  653.             var index = 0;
  654.             var currentUpdate = this.regEditObj.get("CurrentUpdate", NOF.NOFSettings.INT_VALUE);
  655.             
  656.             for ( var i = distribs.length - 2; i > 0; i-- ) {
  657.                 
  658.                 //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+" "+distribs[i]);
  659.                 
  660.                 releaseID    = distribs[i].substring( 0, distribs[i].indexOf(":") );
  661.                 distrNo        = distribs[i].substring( releaseID.length + 1 ) - 0;
  662.                 //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+" releaseID="+releaseID);
  663.                 
  664.                 release        = this.releases[this.getReleaseIndex(releaseID)];
  665.                 distribution = release.distributions[distrNo];
  666.                 
  667.                 infoArr[index] = new Object();
  668.                 infoArr[index].release = release;
  669.                 infoArr[index].distribution = distribution;
  670.                 
  671.                 index++;
  672.             }
  673.             
  674.             return infoArr;
  675.         }    
  676.         
  677.         
  678.         /*
  679.         * checkUpdate
  680.         */
  681.         function checkUpdate() {
  682.             
  683.             var METHOD_NAME = "checkUpdate";    
  684.             if ( this.updatesChecked == true ) {
  685.                 return 0;
  686.             }
  687.             
  688.             //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+" versionInfo="+this.versionInfo);
  689.             
  690.             var res = NOF.UTIL.ResourceBundle.getBundle("Update/UpdateProperties");
  691.             
  692.             var httpObj = new NOF.NET.Http(new NOF.NET.HttpRequest(this.AUTO_UPDATE_URL));
  693.             
  694.             //while ( this.app.OnlineMode(this.AUTO_UPDATE_URL, false) == 1 ) {
  695.             while ( httpObj.isOnline(this.AUTO_UPDATE_URL, false) == 1 ) {
  696.                 /*
  697.                 if (window.showModalDialog("../Update/Offline.html", 0,
  698.                     "status:no;help:no;border:thin;dialogWidth:220px;dialogHeight:110px;center:yes;scroll:no;") == -1) {
  699.                 */
  700.                 if (!NOF.DIALOGS.Messages.warning(res.getProperty("label.offline"), null, null, res.getProperty("Offline.title"), res.getProperty("btn.retry"), res.getProperty("btn.cancel"), /*document.parentWindow*/ window, 290, 100)) {
  701.                     return -1;
  702.                 }
  703.             }
  704.             
  705.             var xmldoc = null;
  706.             xmldoc = NOF.XML.XmlDocument.create();
  707.             
  708.             if( xmldoc == null ) return -1; //THROW Error!
  709.             
  710.             xmldoc.async = false; 
  711.             xmldoc.validateOnParse = true;
  712.             
  713.             xmldoc.load( this.AUTO_UPDATE_URL );
  714.             
  715.             if (xmldoc.parseError.errorCode != 0) {
  716.                 //NOF.util_logging_ConsoleLogger_global.warn(this.CLASS_NAME+"."+METHOD_NAME+" "+xmldoc.parseError.reason+"\n"+"Source = Line : "+xmldoc.parseError.line+"; Char : "+xmldoc.parseError.linepos);
  717.                 return -1; //THROW Error!
  718.             }
  719.             
  720.             
  721.             var docUpdate = xmldoc.documentElement;
  722.             
  723.             // nodes and nodes list
  724.             var nl_release, n_release, n_releaseNotes, 
  725.                 nl_media, n_media, nl_location, n_location,
  726.                 n_requires, nl_requires, nl_regEntry, n_regEntry, n_regEntryValue;
  727.             
  728.             nl_release = docUpdate.getElementsByTagName("release");
  729.             
  730.             this.releases = new Array();                        
  731.             var index = 0;
  732.             var v, vI, b;
  733.             //iterate releases
  734.             for (var i=0; i < nl_release.length; i++) {
  735.                 n_release = nl_release.item(i);
  736.                 
  737.                 v = n_release.getAttribute("version");
  738.                 vI = n_release.getAttribute("versionInfo");
  739.                 
  740.                 // filter the nodes received and keep only those whose version are between 
  741.                 // START_VERSION and END_VERSION
  742.                 if (this.START_VERSION > v || this.END_VERSION < v || vI != this.versionInfo) {
  743.                     continue;
  744.                 }
  745.                 
  746.                 var releaseObj = new this.Release();
  747.                 
  748.                 releaseObj.version        = v;
  749.                 releaseObj.versionInfo    = vI;
  750.                 releaseObj.build        = n_release.getAttribute("build");
  751.                 releaseObj.releaseDate    = n_release.getElementsByTagName("releaseDate").item(0).firstChild.nodeValue;
  752.                 releaseObj.summaryNotes    = n_release.getElementsByTagName("summaryNotes").item(0).firstChild.nodeValue;
  753.                 
  754.                 n_releaseNotes            = n_release.getElementsByTagName("releaseNotes").item(0);
  755.                 releaseObj.releaseNotesURL    = n_releaseNotes.getAttribute("releaseURL");        
  756.                 
  757.                 if (releaseObj.releaseNotesURL == null || releaseObj.releaseNotesURL.trim().length == 0) {
  758.                     //read notes from the CDATA child node
  759.                     releaseObj.releaseNotes    = n_releaseNotes.firstChild.nodeValue;
  760.                 } else {                
  761.                     //read notes from the specified URL
  762.                     //releaseObj.releaseNotes    = this.app2.HttpRequest2( releaseObj.releaseNotesURL, '', '', true, false, true);                                                                        
  763.                     releaseObj.releaseNotes    = httpObj.open(new NOF.NET.HttpRequest(releaseObj.releaseNotesURL)).content;
  764.                 }
  765.                 
  766.                 nl_media    = (n_release.getElementsByTagName("distribution").item(0)).getElementsByTagName("media");
  767.                 
  768.                 var mediaType, distribution, mirrors ; //downloadSize
  769.                 
  770.                 releaseObj.distributions = new Array(); //nl_media.length
  771.                 for (var j=0; j < nl_media.length; j++) {
  772.                     n_media = nl_media.item(j);
  773.                     mediaType = n_media.getAttribute("type");
  774.                     if ( mediaType == "CD" ) {
  775.                         
  776.                         nl_location = (n_media.getElementsByTagName("locations").item(0)).getElementsByTagName("location");
  777.                         
  778.                         releaseObj.mediaCD = new Array(nl_location.length);
  779.                         for (var k=0; k < nl_location.length; k++) {
  780.                             n_location = nl_location.item(k);
  781.                             
  782.                             releaseObj.mediaCD[k] = new Object();
  783.                             releaseObj.mediaCD[k].name    = n_location.getElementsByTagName("name").item(0).firstChild.nodeValue;
  784.                             releaseObj.mediaCD[k].url    = n_location.getElementsByTagName("url").item(0).firstChild.nodeValue;
  785.                         }
  786.                         
  787.                     } else if ( mediaType.toLowerCase() == "download" ) {
  788.                         distribution = new releaseObj.Distribution();
  789.                         // distribution is an obj corresponding to a <media type="download"> node
  790.                         distribution.installType = n_media.getElementsByTagName("installType").item(0).firstChild.nodeValue;
  791.                         distribution.downloadSize= n_media.getElementsByTagName("downloadSize").item(0).firstChild.nodeValue - 0;
  792.                         
  793.                         // if requires a previous update (is not a full type)
  794.                         nl_requires = n_media.getElementsByTagName("requires");
  795.                         if ( nl_requires != null && nl_requires.length > 0 ) {
  796.                             n_requires = nl_requires.item(0);
  797.                             distribution.requires = n_requires.getAttribute("version")+"."+
  798.                                 n_requires.getAttribute("versionInfo")+"."+
  799.                                 n_requires.getAttribute("build");    
  800.                         } else {
  801.                             distribution.requires = null;
  802.                         }
  803.                         //regEntry
  804.                         nl_regEntry = n_media.getElementsByTagName("regEntry");
  805.                         var regEntries = new Array(nl_regEntry.length);
  806.                         for (var k=0; k < nl_regEntry.length; k++) {
  807.                             n_regEntry = nl_regEntry.item(k);
  808.                             regEntries[k] = new distribution.RegEntry();
  809.                             regEntries[k].base = n_regEntry.getAttribute("base");
  810.                             regEntries[k].regName = n_regEntry.getElementsByTagName("regName").item(0).firstChild.nodeValue.trim();
  811.                             n_regEntryValue = n_regEntry.getElementsByTagName("regValue").item(0);
  812.                             regEntries[k].regValue = n_regEntryValue.firstChild.nodeValue - 0;                        
  813.                             regEntries[k].regType = n_regEntryValue.getAttribute("type");
  814.                         }
  815.                         
  816.                         distribution.regEntries = regEntries;
  817.                         
  818.                         nl_location = (n_media.getElementsByTagName("locations").item(0)).getElementsByTagName("location");
  819.                         
  820.                         mirrors = new Array(nl_location.length);
  821.                         for (var k=0; k < nl_location.length; k++) {
  822.                             n_location = nl_location.item(k);
  823.                             
  824.                             mirrors[k] = new Object();
  825.                             mirrors[k].name    = n_location.getElementsByTagName("name").item(0).firstChild.nodeValue.trim();
  826.                             mirrors[k].url    = n_location.getElementsByTagName("url").item(0).firstChild.nodeValue.trim();
  827.                         }
  828.                         
  829.                         distribution.mirrors = mirrors;
  830.                         
  831.                         releaseObj.distributions[releaseObj.distributions.length] = distribution;
  832.                     }
  833.                 }
  834.                 
  835.                 //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+" release "+i+": \n"+releaseObj.toString() );
  836.                 
  837.                 this.releases[index++] = releaseObj; //this.releases.length
  838.             }
  839.             
  840.             this.updatesChecked = true;
  841.             
  842.             try {
  843.                 //this.regEditObj.put("DataLastChecked", Math.round( (new Date()).getTime()/1000) );
  844.                 this.setLastCheckDate(new Date());
  845.             } catch (edate){
  846.                 //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+".checkUpdate "+edate );                
  847.             }
  848.             return 1;
  849.         }
  850.         
  851.         /**
  852.         * showReleaseNotes
  853.         */
  854.         function showReleaseNotes(version, vInfo, build, propertiesObj) {
  855.             var METHOD_NAME = "showReleaseNotes";
  856.             if (this.updatesChecked == false) {
  857.                 if ( this.checkUpdate() == -1 ) 
  858.                     return false;
  859.             }
  860.             //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+" init: "+version + vInfo + build );
  861.             var releaseObj = this.getRelease(version, vInfo, build);
  862.             //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+" release:\r\n"+ releaseObj.toString());        
  863.             
  864.             this.app.WriteTempFile(this.RELEASE_NOTES_FILENAME,
  865.                 '<html><head><title>'+propertiesObj.getProperty('releaseNotes.title')+'</title>' +
  866.                 '<link rel="stylesheet" type="text/css" href="'+ (NOF.App.getSystemDirectory() + NOF.App.getPathSeparator() + "Fsi") + '\\Update\\global.css">\r\n'+
  867.                 '<script language="javascript" src="../NetObjects System/FSI/lib/innovative/IS.js"></script>\r\n' +
  868.                 '<script language="javascript" src="../NetObjects System/FSI/lib/innovative/menu.js"></script>\r\n' +
  869.                 '<script language="JavaScript" src="../NetObjects System/FSI/lib/nof/NOF.js"></script>\r\n' +
  870.                 '<script language="JavaScript" src="../NetObjects System/FSI/lib/nof/ProgId.js"></script>\r\n' +
  871.                 '<script language="JavaScript">\r\n' +
  872.                 'app = new ActiveXObject(NOF.ProgId.FSIApplication);\r\n' +
  873.                 'function exit() { app.CloseDialog(true); }' +
  874.                 '\r\n</script>' +
  875.                 '</head><body><iframe src="' + ("frame" + this.RELEASE_NOTES_FILENAME) + '" align="center" width="'+(this.RELEASE_WINDOW_WIDTH - 50)+'" height="'+ (this.RELEASE_WINDOW_HEIGHT - 140) +'"></iframe>' ,
  876.                 false);
  877.             
  878.             this.app.WriteTempFile("frame" + this.RELEASE_NOTES_FILENAME, '<html><head><link rel="stylesheet" type="text/css" href="'+ (NOF.App.getSystemDirectory() + NOF.App.getPathSeparator() + "Fsi") + '\\Update\\global.css">\r\n</head><body>', false);
  879.             
  880.             this.app.WriteTempFile("frame" + this.RELEASE_NOTES_FILENAME, '<table class="updatesTable" cellpading="0" cellspacing="0" align="center" width="100%">', true);        
  881.             
  882.             var versionI = version+"."+vInfo+"."+build;
  883.             var newRelease = ( versionI > this.currentVersion );
  884.             var strHead = "<tr><td ";
  885.             if (newRelease) {
  886.                 strHead += 'width="25" class="availableUpdate"> </td><td colspan="2" class="availableUpdate" nowrap="true" height="25">';
  887.             } else {            
  888.                 strHead += 'width="25" class="updated"> </td><td colspan="2" class="updated" nowrap="true" height="25">';
  889.             }
  890.             strHead += "<b>" + propertiesObj.getProperty('label.version')+"</b>"+releaseObj.version+" <b>"+propertiesObj.getProperty('label.released')+"</b>"+releaseObj.releaseDate;    
  891.             if ( this.isDuplicateVersion( releaseObj ) ) {
  892.                 strHead += " <b>"+propertiesObj.getProperty('label.build')+"</b>"+releaseObj.build;
  893.             }
  894.             strHead += "</td></tr>";
  895.             
  896.             this.app.WriteTempFile("frame" + this.RELEASE_NOTES_FILENAME, strHead, true);        
  897.             this.app.WriteTempFile("frame" + this.RELEASE_NOTES_FILENAME, "<tr><td width=\"25\" class=\""+ ( (newRelease) ? "a" : "notA" ) +"vailableSummary\"> </td><td class=\""+ ( (newRelease) ? "a" : "notA" ) +"vailableSummary\">"+releaseObj.releaseNotes+"</td><td width=\"25\" class=\""+ ( (newRelease) ? "a" : "notA" ) +"vailableSummary\"> </td></tr>", true);        
  898.             
  899.             //this.app.WriteTempFile("frame" + this.RELEASE_NOTES_FILENAME, releaseObj.releaseNotes, true);
  900.             this.app.WriteTempFile("frame" + this.RELEASE_NOTES_FILENAME, '</table>', true);            
  901.             this.app.WriteTempFile("frame" + this.RELEASE_NOTES_FILENAME, '</body></html>', true);
  902.             
  903.             this.app.WriteTempFile(this.RELEASE_NOTES_FILENAME, '<p align="center"><input type="button" value="'+ propertiesObj.getProperty('close') +'" onclick="exit()"></p>', true);
  904.             this.app.WriteTempFile(this.RELEASE_NOTES_FILENAME, '</body></html>', true);
  905.             
  906.             //this.app2.OpenBrowser(NOF.App.getTempDirectory() + '\\'+this.RELEASE_NOTES_FILENAME, '', this.RELEASE_WINDOW_WIDTH, this.RELEASE_WINDOW_HEIGHT);
  907.             NOF.DIALOGS.BrowserDlg.openBrowser(NOF.App.getTempDirectory() + '\\'+this.RELEASE_NOTES_FILENAME, '', this.RELEASE_WINDOW_WIDTH, this.RELEASE_WINDOW_HEIGHT, true);
  908.             NOF.App.deleteTempDirectory();        
  909.         }
  910.         
  911.         /**
  912.         * showPreviousReleaseNotes
  913.         */
  914.         function showPreviousReleaseNotes(version/*, vInfo, build*/, propertiesObj, ascending) {
  915.             var METHOD_NAME = "showPreviousReleaseNotes";                
  916.             
  917.             if (this.updatesChecked == false) {
  918.                 if ( this.checkUpdate() == -1 ) 
  919.                     return false;
  920.             }
  921.             if ( version == null ) {
  922.                 version = this.currentVersion;
  923.             }
  924.             //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+" init: "+version );        
  925.             var currentReleaseIndex = this.getReleaseIndex(version);
  926.             if (currentReleaseIndex < 0) { 
  927.                 //this must be an update not listed in xml
  928.                 for (var i = this.releases.length - 1; i >= 0; i--) {
  929.                     if ( version > (this.releases[i].version+"."+this.releases[i].versionInfo+"."+this.releases[i].build) ) {
  930.                         currentReleaseIndex = i;
  931.                         break;
  932.                     }
  933.                 }
  934.             }
  935.             
  936.             this.app.WriteTempFile(this.RELEASE_NOTES_FILENAME,
  937.                 '<html><head><title>'+propertiesObj.getProperty('releaseNotes.title')+'</title>' +
  938.                 '<link rel="stylesheet" type="text/css" href="'+ (NOF.App.getSystemDirectory() + NOF.App.getPathSeparator() + "Fsi") + '\\Update\\global.css">\r\n'+
  939.                 '<script language="javascript" src="../NetObjects System/FSI/lib/innovative/IS.js"></script>\r\n' +
  940.                 '<script language="JavaScript" src="../NetObjects System/FSI/lib/nof/NOF.js"></script>\r\n' +
  941.                 '<script language="JavaScript" src="../NetObjects System/FSI/lib/nof/ProgId.js"></script>\r\n' +
  942.                 '<script language="JavaScript">\r\n' +
  943.                 'app = new ActiveXObject(NOF.ProgId.FSIApplication);' +
  944.                 'function exit() { app.CloseDialog(true); }' +
  945.                 '\r\n</script>' +
  946.                 '</head><body><iframe src="' + ("frame" + this.RELEASE_NOTES_FILENAME) + '" align="center" width="'+(this.RELEASE_WINDOW_WIDTH - 50)+'" height="'+ (this.RELEASE_WINDOW_HEIGHT - 140) +'"></iframe>' ,
  947.                 false);    
  948.             
  949.             this.app.WriteTempFile("frame" + this.RELEASE_NOTES_FILENAME,    '<html><head><link rel="stylesheet" type="text/css" href="'+ (NOF.App.getSystemDirectory() + NOF.App.getPathSeparator() + "Fsi") + '\\Update\\global.css">\r\n</head><body>', false);
  950.                 
  951.             /*
  952.             this.app.WriteTempFile(this.RELEASE_NOTES_FILENAME,
  953.             '<p><b>'+propertiesObj.getProperty("label.completedUpdates")+'</b></p>\n',
  954.             true);
  955.             */
  956.             
  957.             if ( (ascending == null) || (ascending == 'undefined') ) {
  958.                 ascending = false;
  959.             }
  960.             
  961.             this.app.WriteTempFile("frame" + this.RELEASE_NOTES_FILENAME, '<table class="updatesTable" cellpading="0" cellspacing="0" align="center" width="100%" >', true);        
  962.             
  963.             var iterRelease;
  964.             var strHead;
  965.             
  966.             var i = (ascending == true) ? 0 : currentReleaseIndex;
  967.             var available = true;
  968.             var clsNamePrefix = null; 
  969.             
  970.             //while (true) {
  971.             for( ; ; ) { 
  972.                 if ( (ascending == true) && (i > currentReleaseIndex) ) {
  973.                     break;
  974.                 }
  975.                 if ( (ascending == false) && (i < 0) ) {
  976.                     break;
  977.                 }
  978.                 
  979.                 iterRelease = this.getRelease(i);
  980.                 //   
  981.                 strHead = "<b>" + propertiesObj.getProperty('label.version')+"</b>"+iterRelease.version+" <b>"+propertiesObj.getProperty('label.released')+"</b>"+iterRelease.releaseDate;    
  982.                 if ( this.isDuplicateVersion( iterRelease ) ){
  983.                     strHead += " <b>"+propertiesObj.getProperty('label.build')+"</b>"+iterRelease.build;
  984.                 }
  985.                 clsNamePrefix = (available) ? "a" : "notA";
  986.                 this.app.WriteTempFile("frame" + this.RELEASE_NOTES_FILENAME, '<tr><td class="'+ clsNamePrefix +'vailableUpdate" width="25"> </td><td class="'+ clsNamePrefix +'vailableUpdate" nowrap="true" height="25">'+ strHead +'</td><td class="'+ clsNamePrefix +'vailableUpdate" width="25"> </td></tr>', true);        
  987.                 this.app.WriteTempFile("frame" + this.RELEASE_NOTES_FILENAME, '<tr><td width="25" class="'+ clsNamePrefix +'vailableSummary"> </td><td class="'+ clsNamePrefix +'vailableSummary" valign="top">' + iterRelease.releaseNotes + '</td><td width="25" class="'+ clsNamePrefix +'vailableSummary"> </td></tr>', true);        
  988.                 
  989.                 this.app.WriteTempFile("frame" + this.RELEASE_NOTES_FILENAME, '<tr><td colspan="3" width="100%" class="between"> </td></tr>', true);
  990.                 
  991.                 if (ascending == true) {     
  992.                     i++;
  993.                 } else {
  994.                     i--;
  995.                 }
  996.                 
  997.                 available = !available;
  998.             }
  999.             
  1000.             this.app.WriteTempFile("frame" + this.RELEASE_NOTES_FILENAME, '<tr><td colspan="3" width="100%" class="between"> </td></tr>', true);        
  1001.             this.app.WriteTempFile("frame" + this.RELEASE_NOTES_FILENAME, '</table></body></html>', true);
  1002.             
  1003.             
  1004.             this.app.WriteTempFile(this.RELEASE_NOTES_FILENAME, '<table class="updatesTable" cellpading="0" cellspacing="0" align="center" width="100%" >', true);
  1005.             this.app.WriteTempFile(this.RELEASE_NOTES_FILENAME, '<tr><td class="between" align="center"> </td></tr>'+            
  1006.                 '<tr><td width="100%" class="between" align="center"><input type="button" value="'+ propertiesObj.getProperty('close') +'" onclick="exit()"></td></tr>', true);        
  1007.             this.app.WriteTempFile(this.RELEASE_NOTES_FILENAME, '</table>', true);        
  1008.             
  1009.             this.app.WriteTempFile(this.RELEASE_NOTES_FILENAME, '</body></html>', true);
  1010.             
  1011.             //this.app2.OpenBrowser(NOF.App.getTempDirectory() + '\\'+this.RELEASE_NOTES_FILENAME, '', this.RELEASE_WINDOW_WIDTH, this.RELEASE_WINDOW_HEIGHT);
  1012.             NOF.DIALOGS.BrowserDlg.openBrowser(NOF.App.getTempDirectory() + '\\'+this.RELEASE_NOTES_FILENAME, '', this.RELEASE_WINDOW_WIDTH, this.RELEASE_WINDOW_HEIGHT, true);
  1013.             NOF.App.deleteTempDirectory();        
  1014.         }
  1015.         
  1016.         /**
  1017.         * getNumberOfReleases
  1018.         */
  1019.         function getNumberOfReleases() {
  1020.             var METHOD_NAME = "getNumberOfReleases";        
  1021.             var relNo = this.releases.length;
  1022.             //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+" returns "+ relNo );
  1023.             return relNo;
  1024.         }    
  1025.         
  1026.         /**
  1027.         * isDuplicateVersion
  1028.         */
  1029.         function isDuplicateVersion( iterRelease ) {
  1030.             var METHOD_NAME = "isDuplicateVersion";        
  1031.             for (var i=0; i < this.releases.length; i++) {
  1032.                 if ( (iterRelease.version == this.releases[i].version) && (iterRelease.versionInfo == this.releases[i].versionInfo) &&
  1033.                     (iterRelease.build != this.releases[i].build) ) {
  1034.                         return true;    
  1035.                     }        
  1036.             }
  1037.             return false;
  1038.         }
  1039.         
  1040.         
  1041.         /**
  1042.         * downloadRelease
  1043.         * @param release - release's full update to be downloaded
  1044.         * @param distribLocation - mirror server ID
  1045.         * @param propertiesObj - properties object to get labels used for user information
  1046.         */
  1047.         function downloadRelease( release, distribLocation, propertiesObj ) {
  1048.             var METHOD_NAME = "downloadRelease";
  1049.             var downloadResult = 0;
  1050.             var localPath = (new NOF.DIALOGS.FileDlg()).selectDirectory();
  1051.             //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+" localPath = "+localPath+" \r\n "+distribLocation+"\r\n"+release.toString());
  1052.             if (localPath.length > 0) {
  1053.                 var fullUpdateURL = null;
  1054.                 
  1055.                 for (var i=0; i < release.distributions.length; i++) {
  1056.                     if (release.distributions[i].installType == "full") {
  1057.                         
  1058.                         //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+" we have full installType");
  1059.                         
  1060.                         for (var j = 0; j < release.distributions[i].mirrors.length; j++) {
  1061.                             //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+" release.distributions["+i+"].mirrors["+j+"].name = "+release.distributions[i].mirrors[j].name);
  1062.                             if (release.distributions[i].mirrors[j].name == distribLocation) {
  1063.                                 fullUpdateURL = release.distributions[i].mirrors[j].url;
  1064.                                 break;
  1065.                             }
  1066.                         }
  1067.                         if (fullUpdateURL != null) 
  1068.                             break;
  1069.                     }                    
  1070.                 }
  1071.                 
  1072.                 //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+" fullUpdateURL = "+fullUpdateURL);
  1073.                 
  1074.                 var fullUpdateName = fullUpdateURL.substring(fullUpdateURL.lastIndexOf("/")+1, fullUpdateURL.length);            
  1075.                 localPath += fullUpdateName;
  1076.                 
  1077.                 var localPathStr = localPath;        
  1078.                 
  1079.                 var maxLengthProgressDlgCanDisplay = propertiesObj.getProperty('maxMessageLengthInProgressDlg') - 0; //42;
  1080.                 if ( (propertiesObj.getProperty('savingUpdate') + " " + localPathStr).length > maxLengthProgressDlgCanDisplay ) {
  1081.                     var i1 = maxLengthProgressDlgCanDisplay - propertiesObj.getProperty('savingUpdate').length - 1; 
  1082.                     var i2 = i1 - fullUpdateName.length - propertiesObj.getProperty('points').length - 1;
  1083.                     localPathStr = localPathStr.substring(0, i2) + propertiesObj.getProperty('points') + "\\" + fullUpdateName;
  1084.                 }        
  1085.                 
  1086.                 //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+" localPath = "+localPath);
  1087.                 
  1088.                 //this.app.OpenProgressDialog( propertiesObj.getProperty('downloading'), propertiesObj.getProperty('savingUpdate') + " " + localPathStr, 0, 0, true);
  1089.                 var progDlg = new NOF.DIALOGS.ProgressDlg();
  1090.                 progDlg.open(propertiesObj.getProperty('downloading'), propertiesObj.getProperty('savingUpdate') + " " + localPathStr, 0, 100, true);
  1091.                 //downloadResult = this.app.HttpDownload(fullUpdateURL, '', '', true, localPath, true);
  1092.                 var req = new NOF.NET.HttpRequest(fullUpdateURL); //req.setIncludeHeaderResult(true);    //req.setIncludeBodyResult(false);
  1093.                 var httpObj = new NOF.NET.Http(req);
  1094.                 downloadResult = httpObj.download(localPath, true);
  1095.                 httpObj = null;
  1096.                 
  1097.                 progDlg.close(0);
  1098.                 progDlg = null;
  1099.                 //this.app.CloseProgressDialog(0);
  1100.                 if (downloadResult) {
  1101.                     NOF.App.setVariable("nof_update_lastDownloadRelease", release.version+"."+release.versionInfo+"."+release.build );
  1102.                 }
  1103.                 
  1104.                 //NOF.util_logging_ConsoleLogger_global.info(this.CLASS_NAME+"."+METHOD_NAME+" at end, result: "+downloadResult);
  1105.                 
  1106.             } 
  1107.             return downloadResult;
  1108.         }
  1109.         
  1110.         /**
  1111.         * getAvailableUpdatesType 
  1112.         */
  1113.         function getAvailableUpdatesType( ) {
  1114.             var METHOD_NAME = "getAvailableUpdatesType";
  1115.             var ret = 0;
  1116.             
  1117.             var doRestart = false;        
  1118.             var containsFullUpdate = false;
  1119.             var thetype;
  1120.             
  1121.             if ( this.isUpdateNeeded() == false ) {
  1122.                 return 0;
  1123.             }
  1124.             
  1125.             var infoArr = this.getNeededReleases( this.getLatestRelease(), null );
  1126.             if ( infoArr.length == 0 ) {
  1127.                 return 0;
  1128.             }
  1129.             
  1130.             for (var j=0; j < infoArr.length; j++) {
  1131.                 
  1132.                 var thetype = infoArr[j].distribution.installType;            
  1133.                 
  1134.                 //NOF.util_logging_ConsoleLogger_global.info( this.CLASS_NAME+"."+METHOD_NAME+" "+ j + ", thetype = "+thetype );
  1135.                 
  1136.                 if (thetype == 'full' || thetype == 'patch' || thetype == 'migrate') {
  1137.                     doRestart = true;                
  1138.                     if (thetype == 'full') {                    
  1139.                         containsFullUpdate = true;
  1140.                         break;
  1141.                     }
  1142.                 }
  1143.             }
  1144.             
  1145.             if ( containsFullUpdate ) {
  1146.                 ret = 1;
  1147.             } else if ( doRestart ) {
  1148.                 ret = 2;
  1149.             } else {
  1150.                 ret = 3;
  1151.             }        
  1152.             
  1153.             return ret;
  1154.         }    
  1155.         
  1156.     }    
  1157.     
  1158.     
  1159.     NOF_Update_ProtoBuilder();    
  1160.     
  1161.     NOF.UPDATE.__proto__.Updater = NOF_Update;
  1162.     
  1163.     //NOF.addVariable("Update.CHECK_ON_LOAD", 0);
  1164.     //NOF.addVariable("Update.CHECK_ON_CONNECT", 1);
  1165. }